ViewController的弱属性没有设置一段时间

时间:2017-01-24 08:36:28

标签: ios objective-c properties

我正在使用MMDrawerController并希望将数据从一个视图控制器传递到另一个视图控制器(HomeViewController到DetailViewController)

HomeViewController视图控制器

Category *categoryItem = [category objectAtIndex:cellIndex];
         UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
        DetailsViewController * centerVC=(DetailsViewController*)[storyboard instantiateViewControllerWithIdentifier:@"DetailsViewController"];
                    centerVC.catName= categoryItem.name ;
            centerVC.catUrl=categoryItem.url;
            UINavigationController * centerNav=[[UINavigationController alloc]initWithRootViewController:centerVC];
            AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
            appDelegate.drawerController.centerViewController=centerNav;

在ViewDidLoad中,我们希望访问属性为 DetailsViewController视图控制器 DetailsViewController.h

@property (nonatomic,weak) NSString* catName;
@property (nonatomic,weak) NSString* catUrl;

- (void)viewDidLoad {
    [super viewDidLoad];

self.navigationItem.title = [_catName uppercaseString];

}

但有时候_catName的值为nil。

有什么不对,如果那么请提示。

如果定义属性的问题很弱,那么我为视图控制器属性选择了什么类型的属性。

4 个答案:

答案 0 :(得分:0)

当您从appdelegate传递数据时,请将您的属性作为强引用。这也会对你有所帮助。

<label> Country </label>
                    <div class="col-md-8">
                        <div class="input-icon right">
                            <select id="country" multiple name="country[]" onchange="
                            getValue('opens-clicks-region', 'student_tracking', 'region', 'country', this.value, this.id)" disabled="disabled">
                                    <option value=""></option>
                            </select>
                        </div>
                    </div>

Differences between strong and weak in Objective-C

答案 1 :(得分:0)

weak说“只要别人强烈指出它就保持这个”。 所以你的属性catName和catUrl只会持续到categoryItem在内存中。

相反,您可以使用copy

@property (nonatomic, copy) NSString* catName;
@property (nonatomic, copy) NSString* catUrl;

副本保证您拥有的字符串不会更改。假设您希望避免传递可变字符串然后在不知情的情况下更改它。

例如,

NSMutableString *someRandomString = [NSMutableString stringWithString:@"stackoverflow"];

Entrepreneur * entrepreneur = [[Entrepreneur alloc] init];
entrepreneur.name = someRandomString;

[someRandomString setString:@"Steve Jobs"];

现在, Entrepreneur 类的 name 属性的值将取决于该属性是声明为strong还是copy;如果属性声明为strong,则为@“Steve Jobs”;如果属性声明为copy,则为@“stackoverflow”。

答案 2 :(得分:0)

当然问题在于NSString属性较弱。你应该对NSString catName和NSString catUrl有很强的引用,因为它们必须在内存中。 在你的情况下,catName和catUrl在方法(已经设置)之后就消失了。

但是你应该因为NSString而设置一个copy属性参数(这里有更多关于这个https://stackoverflow.com/a/31217735/5151981

所以你的代码应该是这样的:

@property (nonatomic, copy) NSString *catName;
@property (nonatomic, copy) NSString *catURLString;

答案 3 :(得分:0)

请使用非原子并保留

@property (nonatomic, retain) NSString* catUrl;
@property (nonatomic, retain) NSString* catName;