ETA:通过分析应用程序获得更多信息,查看底部.
我有一个iPhone应用程序,我刚刚转换为使用ARC,现在我因为僵尸对象而得到了几个错误.在我切换之前,我手动保留它们,一切都很好.我无法弄清楚为什么ARC没有保留它们.对象声明为强属性,并使用点表示法引用.这种情况发生在几个地方,所以我认为我必须对某处的ARC /内存管理有一个基本的误解.
这是一个特别令人沮丧的例子.我有一个3个对象的NSMutableArray.每个对象都有一个属性,它也是一个NSMutableArray,在这种情况下总是有一个对象.最后,该对象具有释放的属性.它令人沮丧的原因是它只发生在原始数组中的第3个对象.前两个对象总是很好.对于我来说,当以相同方式创建和使用的相似对象的相同属性不是这样时,如何释放一个对象的属性是没有意义的.
该数组作为属性存储在UITableViewController上:
@interface GenSchedController : UITableViewController <SectionHeaderViewDelegate>
@property (nonatomic, strong) NSArray *classes;
@end
@implementation GenSchedController
@synthesize classes;
Run Code Online (Sandbox Code Playgroud)
存储在classes
数组中的对象定义为:
@interface SchoolClass : NSObject <NSCopying, NSCoding>
@property (nonatomic, strong) NSMutableArray *schedules;
@end
@implementation SchoolClass
@synthesize schedules;
Run Code Online (Sandbox Code Playgroud)
存储在schedules
数组中的对象定义为:
@interface Schedule : NSObject <NSCopying, NSCoding>
@property (nonatomic, strong) NSMutableArray *daysOfWeek;
@implementation Schedule
@synthesize daysOfWeek;
Run Code Online (Sandbox Code Playgroud)
daysOfWeek
是什么被释放.它只包含几个NSStrings.
我可以看到,在那期间viewDidLoad
所有物体都很好,没有僵尸.但是,当我点击其中一个表格单元格并在第一行设置断点时tableView:didSelectRowAtIndexPath:
,它已经被释放.抛出错误的特定行是在@synthesize daysOfWeek;
下面的第3个"for"循环之后调用的:
for (SchoolClass *currentClass in self.classes) {
for (Schedule *currentSched in currentClass.schedules) {
for …
Run Code Online (Sandbox Code Playgroud) xcode memory-management objective-c ios automatic-ref-counting
我知道有几种方法可以做到这一点,但它们都有一些缺点.是否有"接受"的方式,这被认为是最好的?
我以前使用的Microsoft.Security.Application.AntiXss.JavaScriptEncode()
是很棒的,但AntiXSS已经结束了,因为编码器现在包含在4.5中的.NET中.
但是,由于某种原因,System.Web.Security.AntiXss.AntiXssEncoder
不包括该JavaScriptEncode
方法.
有System.Web.HttpUtility.JavaScriptStringEncode()
,但它使用黑名单方法进行编码,因此它不太可能像白名单编码器一样好.
我已经看到了一些使用的建议System.Web.Script.Serialization.JavaScriptSerializer.Serialize()
,但这只是打电话HttpUtility.JavaScriptStringEncode()
.
那么目前用于编码作为JS变量编写的值的最佳接受白名单方法是什么?